home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / math / fixfloa2 / cfifloat.c < prev    next >
C/C++ Source or Header  |  1995-03-26  |  3KB  |  169 lines

  1. #include <math.h>
  2. #include <stdlib.h>
  3.  
  4. long rand_table[4096];
  5.  
  6. short sin_table[4096];
  7. short asin_table[4096];
  8.  
  9. long  tan_table1[1024];
  10. long  tan_table3[256];
  11. long  tan_table4[256];
  12.  
  13. short  atan_table1[1024];
  14. short  atan_table2[256];
  15. short  atan_table3[256];
  16. short  atan_table4[256];
  17.  
  18. short  log2_table[4096];
  19. short  exp2_table[4096];
  20. short  sqrt_table[4096];
  21. //short  cubrt_table[1024];
  22.  
  23. // these data structures adds up to 22016 bytes
  24.  
  25. #define MPI 3.1415927464
  26.  
  27.  
  28.  
  29. void gen_fixfloat_tables(){
  30.   double v;
  31.   long i,a;
  32.  
  33.  
  34.   for(v=MPI/16384,i=0;i<4096;v+=MPI/8192,i++)
  35.     sin_table[i]=sin(v)*65536.0;
  36.  
  37.  
  38.   for(v=1.0/8192,i=0;i<4096;v+=1.0/4096,i++)
  39.     asin_table[i]=65536.0*asin(v)/(2*MPI);
  40.  
  41.  
  42.   for(a=8,i=0;i<1024;i++,a+=16)
  43.     tan_table1[i]=65536.0*tan(a*2*MPI/65536);
  44.  
  45.   for(a=0x3C00+2,i=0;i<256;i++,a+=4)
  46.     tan_table3[i]=65536*tan(a*2*MPI/65536);
  47.  
  48.   for(a=0x3F00,i=0;i<256;i++,a++)
  49.     tan_table4[i]=65536*tan(a*2*MPI/65536);
  50.  
  51.  
  52.   for(a=128,i=0;i<1024;i++,a+=256)
  53.     atan_table1[i]=65536*atan(a/65536.0)/(2*MPI);
  54.  
  55.   for(a=2048,i=0;i<256;i++,a+=4096)
  56.     atan_table2[i]=65536*atan(a/65536.0)/(2*MPI);
  57.  
  58.   for(a=65536,i=0;i<256;i++,a+=131072)
  59.     atan_table3[i]=65536*atan(a/65536.0)/(2*MPI);
  60.  
  61.   for(a=16*65536,i=0;i<256;i++,a+=32*65536)
  62.     atan_table4[i]=65536*atan(a/65536.0)/(2*MPI);
  63.  
  64.   for(a=8,i=0;i<4096;i++,a+=16)
  65.     log2_table[i]=65536.0*log((65536+a)/65536.0)/log(2.0);
  66.  
  67.   for(a=8,i=0;i<4096;i++,a+=16)
  68.     exp2_table[i]=(exp(log(2)*a/65536.0)-1)*65536;
  69.  
  70.   for(a=8,i=0;i<4096;i++,a+=16)
  71.     sqrt_table[i]=sqrt(a/65536.0)*65536.0;
  72.  
  73. /*  for(a=32,i=0;i<1024;i++,a+=64)
  74. //    cubrt_table[i]=sqrt(a/65536.0)*65536.0;
  75. cubrt_table[i]=exp(log(a/65536.0)/3)*65536.0;*/
  76.  
  77.   for(i=0;i<4096;i++)
  78.     rand_table[i]=(((rand()<<12)+rand())<<12)+rand();
  79.   }
  80.  
  81. long fftoa(long ff, char *buf){
  82.   long p,pow;
  83.   long tmp;
  84.  
  85.   if(!buf) return -1;
  86.  
  87.   pow=65536*10000;
  88.   p=0;
  89.  
  90.   if(ff<0){
  91.     buf[0]='-', p++,ff=-ff;
  92.     if(ff==0x80000000) ff=0x7FFFFFFF;          // some numbers aren't possible to negate...
  93.     }
  94.  
  95.   while(ff/pow==0 && pow>65540) pow/=10;
  96.  
  97.   while(pow>=65536){
  98.     tmp=ff/pow;
  99.     ff-=tmp*pow;
  100.     buf[p]=tmp+48;
  101.     p++;
  102.     pow=pow/10;
  103.     while (ff/pow>9) pow++;
  104.     }
  105.  
  106.   if(ff){
  107.     buf[p++]='.';
  108.     while(ff && pow>1){
  109.       tmp=ff/pow;
  110.       ff-=tmp*pow;
  111.       buf[p]=tmp+48;
  112.       p++;
  113.       pow=pow/10;
  114.       while (pow && ff/pow>9) pow++;
  115.       }
  116.     while(buf[p-1]=='0') p--; // cut trailing zeroes
  117.     }
  118.  
  119.  
  120.  
  121.   buf[p]=0;
  122.  
  123.   return 0;
  124.   }
  125.  
  126.  
  127. long fftoah(long ff, char *buf){
  128.   long p,pow;
  129.   long tmp;
  130.  
  131.   if(!buf) return -1;
  132.  
  133.   pow=65536*4096;
  134.   p=0;
  135.  
  136.   if(ff<0) buf[0]='-', p++,ff=-ff;
  137.  
  138.   while(pow>=65536){
  139.     tmp=ff/pow;
  140.     ff-=tmp*pow;
  141.  
  142.     if(tmp>9) tmp+='A'-'9'-1;
  143.  
  144.     buf[p]=tmp+48;
  145.     p++;
  146.     pow>>=4;
  147.     }
  148.  
  149.  
  150.     buf[p++]='.';
  151.     while(pow){
  152.       tmp=ff/pow;
  153.       ff-=tmp*pow;
  154.  
  155.       if(tmp>9) tmp+='A'-'9'-1;
  156.  
  157.       buf[p]=tmp+48;
  158.       p++;
  159.       pow>>=4;
  160.  
  161.  
  162.     }
  163.  
  164.   buf[p]=0;
  165.  
  166.   return 0;
  167.   }
  168.  
  169.